#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Copyright (c) Huawei Technologies Co., Ltd. 2025.
# All rights reserved.
# Licensed under the CANN Open Software License Agreement Version 1.0.

"""
NMS算子结果验证脚本
功能：
    - 读取实际计算结果与golden结果
    - 验证结果一致性
    - 输出日志与退出码
"""

import os
import sys
import logging
import numpy as np
import warnings
import datetime

LOSS = 1e-5  # 误差容忍阈值（此处用于未来扩展）
MINIMUM = 1e-10  # 避免除零的极小值

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

def verify_result():
    if len(sys.argv) != 3:
        logging.error("用法: python3 verify_result.py <实际结果文件> <黄金标准文件>")
        sys.exit(1)
    
    output_file = sys.argv[1]
    golden_file = sys.argv[2]
    
    # 检查文件是否存在
    if not os.path.exists(output_file):
        logging.error(f"实际结果文件不存在: {output_file}")
        sys.exit(1)
    if not os.path.exists(golden_file):
        logging.error(f"黄金标准文件不存在: {golden_file}")
        sys.exit(1)
    
    # 读取二进制文件
    try:
        output_data = np.fromfile(output_file, dtype=np.uint8)  # NMS输出为uint8掩码
        golden_data = np.fromfile(golden_file, dtype=np.uint8)
    except Exception as e:
        logging.error(f"读取文件失败: {str(e)}")
        sys.exit(1)
    
    # 验证长度一致性
    if len(output_data) != len(golden_data):
        logging.error(f"结果长度不一致! 实际: {len(output_data)}, 预期: {len(golden_data)}")
        sys.exit(1)
    
    # 验证内容一致性（NMS掩码应为0或1，需完全匹配）
    diff_count = np.sum(output_data != golden_data)
    if diff_count == 0:
        logging.info("#####################################\n")
        logging.info("INFO: you have passed the Precision!\n")
        logging.info("结果验证通过: 实际结果与黄金标准完全一致\n")
        logging.info("#####################################\n")
        sys.exit(0)
    else:
        logging.error(f"结果验证失败: 存在 {diff_count} 处不一致")
        # 打印不一致的位置
        diff_indices = np.where(output_data != golden_data)[0]
        for idx in diff_indices:
            logging.error(f"位置 {idx}: 实际值={output_data[idx]}, 预期值={golden_data[idx]}")
        sys.exit(1)


if __name__ == '__main__':
    verify_result()